Lay the repository out, and give a fresh clone two commands (#13) - #182
Merged
Conversation
A clone could build nothing and run nothing. It can now do both, with the two commands written in README.md and no state left by a previous build needed for either. One directory under src/ per thing 0003 says the core owns, so the boundary is in the tree rather than only in a document: server, session, cache, artwork, playback and measurement. Two directories sit beside those six and are not concerns from that record; each says so in its own first paragraph. failure holds the error vocabulary the six map onto, and diagnostics holds the sink a client supplies, which is there because 0009 states a thread rule for it and a rule with no name to attach to is a rule a reader meets nowhere. There is no behaviour. Every type is a name carrying the statement 0009 makes about its kind and nothing else, and each names the issue that owns what it will do. The half that is a guard rather than a layout is 0009's obligation. That record states its reentrancy and thread-safety rules per kind of object because there was no type to attach them to, and says the names arrive with #11 and #13. The statements are attached where a reader meets each type, and tests/thread_statements.rs refuses a change that breaks one: "safe from any thread" is a compile-time bound, checked from outside the crate so that it asks the same question a client asks, and checked on the trait object for a client-supplied store so that dropping the bound from the trait is caught rather than only a bad implementor. Both directions were proven to bite before this landed, and the proofs are in the pull request body. What that bound is worth today is stated in the crate documentation rather than implied: the types hold nothing, so no assertion can fail on these bytes. It bites on the first field. The package is called flowfin-core rather than core. The standard library owns that name, and a local crate carrying it makes every path that means the standard one ambiguous at the first use. One sentence in README.md was a correction rather than an addition. What it said before: > What shared means technically is the first maintainer decision and the plan > states the options with their costs rather than choosing one. Entry 2 of #1 was answered on 2026-08-24 and 0011 records it, so that sentence had stopped being true; it now names the answer and links the record. Signed-off-by: Nils Lehnen <30603423+iderex@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The issue this belongs to
#13
Named rather than closed. The third done-condition is that the gate workflows
added in this milestone invoke these same two commands, and no such workflow
exists yet; #15 is where the first one lands. Everything else in the condition is
met and shown below.
What changed
A crate, a layout, two commands and one guard.
One directory under
src/per thing0003 says the core owns, so
that the boundary is visible in the tree rather than only in a document:
src/server/,src/session/,src/cache/,src/artwork/,src/playback/andsrc/measurement/. Two directories sit beside those six and are not concerns fromthat record, and each says so in its own first paragraph:
src/failure/for theerror vocabulary the six map onto, and
src/diagnostics/for the sink a clientsupplies.
There is no behaviour anywhere in it. Every type is a name carrying the statement
0009 makes about its kind, and each names the issue that owns what it will do.
README.mdgains the two commands, a sentence on what a fresh clone needsinstalled, and the arrangement above. One sentence in it is a correction rather
than an addition. What it said before:
Entry 2 of #1 was answered on 2026-08-24 and 0011 recorded it, so that sentence
had stopped being true.
The means, and why it fits
Rust with cargo, because
0011
records that choice and this is the first change that had to make it real. Nothing
here adds a language, a runtime or a dependency beyond what that record already
priced: the manifest declares no dependencies, the formatter and the analyser are
components of the toolchain, and the suite this change starts is the one every
later issue in M2 uses.
What failure it prevents
The one this issue names: a clone that builds nothing and runs nothing, and a
layout that arrives as eleven accidents instead of one decision.
The sharper one is 0009's, and it is a failure that would have been silent. That
record states its reentrancy and thread-safety rules per kind of object because
there was no type to attach them to, and says the names arrive with #11 and #13.
A layout satisfying every word of this issue could still leave those statements
attached to nothing: the record goes on being true, and the reader who meets a
handle in the tree meets no statement about which thread they may call it from.
The statements are attached to the types, and the suite refuses a change that
breaks one.
Evidence
The two commands
README.mdnames, run from a tree with no build state, at thecommit being pushed:
The toolchain both were run on:
The analyser and the formatter are clean, which matters because #17 and #18 will
turn each into a check and a backlog on the first day is a backlog forever:
The lockfile the two commands assert against is committed and holds one package,
which is this one:
Every path
README.mdnames resolves. The whole-tree document verb does notfinish inside nine minutes on this machine, so its own rules were applied to that
one document through the script's own functions rather than a second copy of
them, and the run in this pull request is the one over the whole tree:
Sixteen named paths resolved, none excused, no refusal.
What a guard here refuses, and the proof it bites
tests/thread_statements.rsrefuses a type that stops being safe to use from anythread, for each of the kinds 0009 makes that statement about. It refuses in two
directions and both were proven before this landed.
A field that is not thread-safe, added to the core handle:
The bound dropped from a client-supplied store, which is the direction a check
written only against an implementor would miss:
And green again with the violation removed, which is the run in the evidence
section above.
What the guard is worth today is stated in the crate documentation rather than
implied: the types hold nothing, so no assertion can fail on the bytes in this
tree. It bites on the first field, which is the change it exists for, and the two
runs above are that change made deliberately.
What this does not cover
The third done-condition of #13. No gate workflow added in this milestone exists,
so nothing here proves that the gate runs these two commands rather than variants
of them. #15 is the first one and this issue stays open until then.
Three of 0009's statements are not checked by anything here and the test file says
so in its own first paragraph: that the secret store is called from one lane only
and never concurrently for one session, that a sink must not block, and that a
sink must not call back into the core. Those are properties of the caller rather
than of the type. #117 is where they are meant to be observed, and it has its own
bounds.
Nothing was built for any target other than this host, and nothing cross-compiled.
Which triples the gate covers is #113.
No version is pinned. #14 owns that, and
README.mdsays a current stabletoolchain builds this rather than naming a digit that would then exist in two
places.
src/failure/andsrc/diagnostics/hold no type yet. The failure vocabulary is#4 and #37 and the diagnostics interface is #100, and inventing either here would
be deciding them in the file that was meant to hold them.
The
Send + Syncbound on a client-supplied trait is not a statement that thecore calls it concurrently. 0009's sentence is the rule for each, and the doc
comment on the secret store says the opposite of concurrent access explicitly so
that the bound is not read as permission.
Who has read it
Nobody but me. There is no second reader on this board tonight, and the evidence
above stands in place of one.